<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <p>vue中数据更新异常——数据更新，页面没有更新</p>
    <p>数组更新异常:1.通过下标更新一整项;2.直接通过length修改数组长度</p>
    <ul>
      <li v-for="(item, index) in arr1" :key="index+'item1'">
        {{item.name}}-￥{{item.price}}元
      </li>
    </ul>
    <button @click="changeArr1">更新数组1</button>
    <button @click="changeArr1Len">更新数组2</button>
    <hr>
    <p>对象更新异常:1.新增对象属性;2.删除对象属性</p>
    <ul>
      <li v-for="(val, key, index) in obj1" :key="val">
        {{index+1}}. {{key}}: {{val}}
      </li>
    </ul>
    <button @click="add">新增</button>
    <button @click="del">删除</button>
  </div>
  <script src="../vue.js"></script>
  <script>
    let vm = new Vue({
      el: '#app',
      data: {
        arr1: [
          {name: 'apple', price: 5},
          {name: 'banana', price: 3},
          {name: 'pear', price: 4},
          {name: 'orange', price: 2}
        ],
        obj1: {
          name: '马保国',
          age: 70,
          title: '形意八卦掌门人'
        }
      },
      methods: {
        changeArr1() {
          // this.arr1[0] = {name: 'apple', price: 4.9}; 错误的方式
          // 正确的方式1
          // this.arr1.splice(0, 1, {name: 'appleeee', price: 4.9});
          // 正确的方式2
          // this.$set(this.arr1, 0, {name: 'appleeee', price: 4.9});
          // 正确的方式2.5
          Vue.set(this.arr1, 0, {name: 'appleeee', price: 4.9});
          console.log(this.arr1);
        },
        changeArr1Len() {
          // this.arr1.length = 2; 错误的方式
          // 正确的方式
          this.arr1.splice(2)
          console.log(this.arr1);
        },
        add() {
          // this.obj1.sex = '男'; 错误的方式
          // 正确的方式1
          // this.$set(this.obj1, 'sex', '男');
          // 正确的方式1.5
          Vue.set(this.obj1, 'sex', '男');
          console.log(this.obj1);
        },
        del() {
          // delete this.obj1.title; 错误的方式
          this.$delete(this.obj1, 'title')
          console.log(this.obj1);
        }
      },
    })
  </script>
</body>
</html>